package org.com.creationalPattern.prototypePattern;

/**
 * @author Jonny
 * @version 1.0
 * @Description:
 * @date 2021/4/14 16:34
 *
 * ■ 性能优良：原型模式是在内存二进制流的复制，要比直接new一个对象性能好，
 * 特别是在一个循环体内产生大量的对象时，原型模式可以更好地体现其优点。
 * ■ 逃避构造函数的约束：这既是优点也是缺点，直接在内存中复制，构造函数是不会执行的，
 * 因此减少了约束，需要在实际应用时进行权衡考虑。
 *
 *原型模式的使用场景如下。
 * ■ 资源优化场景，类初始化需要消化非常多的资源，这个资源包括数据、硬件资源等。
 * ■ 性能和安全要求的场景，通过new产生一个对象需要非常烦琐的数据准备或访问权限，可以使用原型模式。
 * ■ 一个对象多个修改者的场景，一个对象需要提供给其他对象访问，而且各个调用者可能都需要修改其值时，
 * 可以考虑使用原型模式复制多个对象供调用者使用。在实际项目中，原型模式很少单独出现，
 * 一般是和工厂方法模式一起出现，通过clone()方法创建一个对象，然后由工厂方法提供给调用者。
 *
 * 注意Java中Object提供的clone()方法采用的是“浅”克隆，即只复制关联对象的引用，而不复制关联对象的数据。
 * 如果需要“深”克隆，则需要在覆盖clone()方法时手动控制克隆的深度。
 *
 */
public class Mail implements Cloneable {
    //收件人
    private String receiver;
    //邮件标题
    private String subject;
    //称谓
    private String appellation;
    //邮件内容
    private String context;
    //邮件的尾部
    private String tail;
    //构造函数
    public Mail(String subject,String context){
        this.subject=subject;
        this.context=context;
    }
    public Mail clone(){
        Mail mail=null;
        try{
            mail=(Mail)super.clone();
        }catch (Exception ex) {
            ex.printStackTrace();
        }
        return mail;
    }

    public String getTail() {
        return tail;
    }

    public void setTail(String tail) {
        this.tail = tail;
    }

    public String getContext() {
        return context;
    }

    public void setContext(String context) {
        this.context = context;
    }

    public String getAppellation() {
        return appellation;
    }

    public void setAppellation(String appellation) {
        this.appellation = appellation;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }
}
